package com.test.io.buffer.obj;

import org.junit.Test;

import java.io.*;

/**
 * @version 1.0
 * @Author: 许啸林
 * @Date: 2021/6/3 10:41
 *   1.序列化和反序列化: 序列化就是保存数据时同时保存数据的值和类型, 反序列化就是在读取数据的时候读取数据的值和类型
 *   2. 需要让对象支持序列化机制 必须实现两个接口之一(1.Serializable 标记接口 2.External)
 *   对象处理流 可以将java对象，数据类型 进行序列化并保存到文件中, 通过反序列化读取dat文件中的数据
 */
public class ObjStreamDemo{

    /**
     * 向文件中存入序列化信息
     */
    @Test
    public void  writeData() {
        ObjectOutputStream ops =  null;
        try {
            ops =  new ObjectOutputStream(new FileOutputStream("d:\\obj.dat"));
            // int类型自动装箱 int -> Integer 实现了Serializable
            ops.writeInt(100);
            // char -> Character  实现了Serializable
            ops.writeChar('a');
            // boolean -> Boolean 实现了Serializable
            ops.writeBoolean(false);
            // double -> Double 实现了Serializable
            ops.writeDouble(1.32);
            // 写入字符 String 实现序列化
            ops.writeUTF("写入信息");
            ops.writeObject(new Dog("哈士奇",2, "中国", "白色", new Master("1231")));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(ops != null) {
                try {
                    ops.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //　反序列化　dat文件信息 (读取)反序列化的顺序要和(写入)序列化的顺序一致
    // 在使用main 调用 static修饰方法时 nation有值？
    @Test
    public void readData() {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("d:\\obj.dat"));
            System.out.println(ois.readInt());
            System.out.println(ois.readChar());
            System.out.println(ois.readBoolean());
            System.out.println(ois.readDouble());
            System.out.println(ois.readUTF());
            // 向下转型
            Dog dog = (Dog) ois.readObject();
            System.out.println(dog.toString());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if(ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
